package com.alibobo.tech5.sixenine.pan69;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.Hashtable;
import java.util.List;

import com.alibobo.tech5.ganji.GJR;

public class Pan69 implements Serializable {

	private static final long serialVersionUID = -6558473764623822936L;
	protected ClazzEntry[] 四課 = null;
	protected TranEntry[] 三傳 = null;
	protected PanEntry[] 盤 = null;

	// level1
	protected String 日干支 = "";
	protected String 干上 = "";
	protected int panOffset = 0;
	protected int 發用課 = -1;
	protected String tm = "";
	protected String notes = "";
	protected List<String> 日貴 = new ArrayList<String>();
	protected List<String> 夜貴 = new ArrayList<String>();
	// level 2
	protected String 時干支 = "";
	protected String 月將 = "";
	// level3
	protected String 年干支 = "";
	protected String 月干支 = "";

	// level
	protected Date 起課日期;

	// level4
	protected String 年命 = "";
	protected String 行年 = "";

	public Pan69() {

	}

	protected List<String> cal四課(String 日干, String 日支, int offset) {

		String 寄宮 = GJR.get天干寄宮(日干);
		String 干上 = GJR.offset(寄宮, offset);
		String 干上上 = GJR.offset(干上, offset);
		String 支上 = GJR.offset(日支, offset);
		String 支上上 = GJR.offset(支上, offset);
		List<String> c4 = new ArrayList<String>();
		c4.add(干上 + 日干);
		c4.add(干上上 + 干上);
		c4.add(支上 + 日支);
		c4.add(支上上 + 支上);
		return c4;
	}

	protected void prepare盤() {
		盤 = new PanEntry[12];
		int offset = getPanOffset();
		for (int i = 0; i < 12; i++) {
			PanEntry pe = new PanEntry();
			pe.set地(GJR.id2Ji(i));
			pe.set天(GJR.id2Ji(i + offset));
			pe.set陰神(GJR.id2Ji(i + offset * 2));
			pe.set支神(GJR.get支神(pe.get天()));
			盤[i] = pe;
		}
	}

	protected Hashtable<String, String> get遁干表() {
		return GJR.get遁干表(get日干支());
	}

	protected void prepare三傳() {
		Hashtable<String, String> 遁干表 = get遁干表();
		String 日干 = get日干();

		int offset = getPanOffset();
		for (int i = 0; i < 3; i++) {
			TranEntry te = 三傳[i];
			String 支神 = te.支;
			te.地 = GJR.offset(支神, -offset);
			te.陰神 = GJR.offset(支神, offset);
			te.遁干 = 遁干表.get(支神);
			te.六親 = GJR.六親AofB(te.支, 日干);
			if ("".equals(te.六親)) {
				te.notes.add("空亡");
			}
		}
	}

	protected void prepare三傳四課之天將() {

	}

	public void prepareStep2() {
		prepare三傳四課之天將();
	}

	public void prepareStep1() {
		List<String> clazz4 = cal四課(get日干(), get日支(), getPanOffset());
		prepare盤();
		set四課(clazz4);
		prepare三傳();
	}

	public String get日干() {
		return GJR.pickFirstWord(get日干支());

	}

	public String get日支() {
		return GJR.pickLastWord(get日干支());
	}

	public void set四課(List<String> clazz) {
		四課 = new ClazzEntry[4];
		for (int i = 0; i < 4; i++) {
			四課[i] = new ClazzEntry(clazz.get(i));
		}
	}

	public void set三傳(String t3) {
		三傳 = new TranEntry[3];
		for (int i = 0; i < 3; i++) {
			三傳[i] = new TranEntry();
			String ji = String.valueOf(t3.charAt(i));
			三傳[i].set支(ji);
		}
	}

	/*************************************
	 * 
	 * 
	 * @param idx
	 * @return
	 ************************************/
	public PanEntry get盤位(String 天盤) {
		for (PanEntry pe : 盤) {
			if (pe.天.equals(天盤))
				return pe;
		}
		return null;
	}

	public PanEntry get盤位(int idx) {
		String ji = GJR.id2Ji(idx);
		return get盤位by地盤(ji);
	}

	public PanEntry get盤位by地盤(String ji) {
		for (PanEntry pe : 盤) {
			if (pe.地.equals(ji))
				return pe;
		}
		return null;
	}

	public String get日干支() {
		return 日干支;
	}

	public void set日干支(String 日干支) {
		this.日干支 = 日干支;
	}

	public String get干上() {
		return 干上;
	}

	public void set干上(String 干上) {
		this.干上 = 干上;
	}

	public int getPanOffset() {
		return panOffset;
	}

	public void setPanOffset(int panOffset) {
		this.panOffset = panOffset;
	}

	public int get發用課() {
		return 發用課;
	}

	public void set發用課(int 發用課) {
		this.發用課 = 發用課;
	}

	public String getTm() {
		return tm;
	}

	public void setTm(String tm) {
		this.tm = tm;
	}

	public String getNotes() {
		return notes;
	}

	public void setNotes(String notes) {
		this.notes = notes;
	}

	public String get時干支() {
		return 時干支;
	}

	public void set時干支(String 時干支) {
		this.時干支 = 時干支;
	}

	public String get月將() {
		return 月將;
	}

	public void set月將(String 月將) {
		this.月將 = 月將;
	}

	public String get年干支() {
		return 年干支;
	}

	public void set年干支(String 年干支) {
		this.年干支 = 年干支;
	}

	public String get月干支() {
		return 月干支;
	}

	public void set月干支(String 月干支) {
		this.月干支 = 月干支;
	}

	public Date get起課日期() {
		return 起課日期;
	}

	public void set起課日期(Date 起課日期) {
		this.起課日期 = 起課日期;
	}

	public String get年命() {
		return 年命;
	}

	public void set年命(String 年命) {
		this.年命 = 年命;
	}

	public String get行年() {
		return 行年;
	}

	public void set行年(String 行年) {
		this.行年 = 行年;
	}

	public List<String> get日貴() {
		return 日貴;
	}

	public void set日貴(List<String> 日貴) {

		this.日貴.clear();
		this.日貴.addAll(日貴);
	}

	public List<String> get夜貴() {
		return 夜貴;
	}

	public void set夜貴(List<String> 夜貴) {
		this.夜貴.clear();
		this.夜貴.addAll(夜貴);
	}

}
